<?php
/*
SQL BloodLibrary for MySQL
SQLBloodLibrary - SLB Library

By José Cabo Carsí - folcwine@gmail.com
*/

class sbl{
	//Constantes del sistema
	private static $host;
	private static $user;
	private static $pass;
	private static $db;
	private static $conexion;
	//private variables
	private $conectado; //tipo: bool; Conoce si estas conectado o no -- NO NECESARIO QUE LA BD ESTÉ SELECCIONADAs
	private $DBselected; //tipo: bool; Conocer si estás con la db seleccionada o no
	private $consulta; //contendrá LAS consultas
	private $cantidad; //La cantidad de consultas que contiene $consulta
	
	//Constantes
	const startTransaccion = 'START TRANSACTION;'; // 'BEGIN;'
	const commit = 'COMMIT;'; //Almacenar cambios
	const rollback = 'ROLLBACK;'; //Deshacer

	/*Methods*/
	/*Constructor:  Puedes pasarle los datos de conexión*/
	public function __construct($host = NULL, $user = NULL, $pass = NULL, $db = NULL){
		$this->resetConsulta();
		if(isset($host) && isset($user) && isset($pass) && isset($db)){ //datos de conexión por parámetro
			$this->connectAll($host, $user, $pass, $db);
		}elseif(isset($host) && isset($user) && isset($pass)){
			$this->connect($host, $user, $pass);
		} else {
			$this->storeConectado(false);
			$this->storeDBSelected(false);
		}
	}
	public function connectAll($host = NULL, $user = NULL, $pass = NULL, $db = NULL){
		$this->connect($host, $user, $pass);
		$this->selectDB($db);
	}
	//Conectar con la BD
	public function connect($host = NULL, $user = NULL, $pass = NULL){
		if($this->isConectado()) $this->desconectar(); //Si hay una conexión la cierra
		//Comprobamos si es por  por parámetros o propiedades
		if(isset($host) && isset($user) && isset($pass)){ //Por propiedades
			$this->storeHost($host); //Guardamos            //
			$this->storeUser($user); //los parámetros       //
			$this->storePass($pass); //en las propiedades   //
			$this->goConnect(); //Creamos instancia
		} elseif($this->getHost() && $this->getUser() && $this->getPass()){ //Por propiedades
			$this->goConnect();
		} else { //Si hay algún problema con los credenciales
			die('Imposible conectarse al servidor de la BD (sin credenciales): '. mysql_error());
		}
	}
	//Seleccionar una BD
	public function selectDB($db = NULL){
		if($this->isConectado() == true){//Si no están conectado no se puede seleccionar una BD
			if(isset($db)){ // Por parámetro
				$this->storeDB($db); //Guardamos valor
				$this->goSelectDB(); //Ejecutamos selección
			} elseif($this->getDB()){ //Por valor almacenado
				$this->goSelectDB();//Ejecutamos selección
			} else {
				die('No hay ninguna BD que seleccionar');
			}
		} else die('No se pudo seleccionar la BD porque todavía no hay una conexión.');
	}
	
	//Te desconecta
	public function desconectar(){
		mysql_close(self::$conexion);
		$this->storeConexion(NULL);
	}
	
	//Métodos de guardado o devolución
	public function storeHost($host){self::$host = $host;}//Guarda la variable $host
	public function getHost(){return self::$host;} //Devuelve la propiedad $host
	
	public function storeUser($user){self::$user = $user;} //Guarda la variable $user
	public function getUser(){return self::$user;} //Devuelve la propiedad $user

	public function storePass($pass){self::$pass = $pass;}//Guarda la variable $pass
	public function getPass(){return self::$pass;} //Devuelve la propiedad $pass
	
	public function storeDB($db){self::$db = $db;}//Guardamos la variable $db
	public function getDB(){return self::$db;} //Devuelve la propiedad $db

	public function storeConexion($conexion){//Guardamos la variable $conexion
		self::$conexion = $conexion;
		if($conexion) $this->storeConectado(true);
		else $this->storeConectado(false);
	}
	public function getConexion(){return self::$conexion;}//Obtenemos la propiedad recurso $conexión
	
	private function storeConectado($conectado){
		$this->conectado = $conectado; //true || false
		if(!$conectado) $this->storeDBSelected(false);
	}
	public function isConectado(){return $this->conectado;} //Sabemos si está o no conectado -- NO NECESARIAMENTE CON DB SELECCIONADA
	
	private function storeDBSelected($selected){ $this->DBselected = $selected;}
	public function isDBSelected(){return $this->DBselected;}
	
	private function resetConsulta(){
		$this->consulta = array();
		$this->cantidad = 0;
	}
	public function getCantidad(){return $this->cantidad;}
	private function getStarTransaction(){return self::startTransaccion;}
	private function getCommit(){return self::commit;}
	private function getRollback(){return self::rollback;}
	
	/*Métodos internos*/
	private function goConnect(){//Iniciamos conexión simple
		$conexion = mysql_connect(self::$host, self::$user, self::$pass)
			or die('Imposible conectarse al servidor de la BD: '. mysql_error());
		$this->storeConexion($conexion);
	}
	private function goSelectDB(){//Iniciamos selección de la BD
		mysql_select_db($this->getDB(), $this->getConexion())
			or die('No se pudo seleccionar la BD: '. mysql_error());
	}
	private function sendThisString($string){
		$reg = mysql_query($string, $this->getConexion())
			or die ("Fallo al realizar la consulta: ". mysql_error() .' <br />Cadena: '.$string);
		return $this->arrayzar($reg);
	}
	private function arrayzar($resul, $inicio = 0, $tipo=MYSQL_ASSOC) {
		if(is_bool($resul)) return NULL;
		$i = 0;
		$reg=array();
		while ($reg[$i] = mysql_fetch_array($resul, $tipo)) $i++;
		array_pop($reg);
		return $reg;
	}
	/*Métodos de envio de consultas*/
	public function add($consulta, $send = false){
		if(!$this->isConectado()) die('Imposible realizar la consulta porque no existe una conexión.');
		if(is_string($consulta)){
			$this->consulta[$this->getCantidad()] = $consulta;
			$this->cantidad++;
			if($send){ //Envío directo con la última consulta;
				return $this->send();
			}
		} else {
			die('La consulta: "__'.$consulta.'__" NO es una consulta válida. (debe ser un string)');
		}
	}
	
	public function send(){
		if(!$this->isConectado()) die('Imposible realizar la consulta porque no existe una conexión.');
		$cant = $this->getCantidad();
		if($cant > 1){
			$this->sendThisString($this->getStarTransaction()); //Start transaction
			for($i=0; $i<$cant; $i++){
				$aux = $this->sendThisString($this->consulta[$i]);//Enviamos todas las consultas
				if($aux) $result = $aux;
			}
			$this->sendThisString($this->getCommit()); //Commit
			$this->resetConsulta();
		}elseif($cant == 1){
			$result = $this->sendThisString($this->consulta[0]);
			$this->resetConsulta();
		} else {
			die("No hay ninguna consulta que enviar.");
		}
		return $result;
	}

}

?>